/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package managedbean;

import ejb.common.ComuneManagerLocal;
import ejb.common.NegozioManagerLocal;
import entity.Comune;
import entity.Negozio;
import entity.Provincia;
import facade.ProvinciaFacade;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.ValueChangeEvent;
import javax.faces.event.ValueChangeListener;

/**
 *
 * @author Carmela
 */
public class ProvinciaComuni implements ValueChangeListener,Serializable {
    @EJB
    private NegozioManagerLocal negozioManager;
    @EJB
    private ComuneManagerLocal comuneManager;
    @EJB
    private ProvinciaFacade provinciaFacade;
    private Provincia provincia;
    private Comune comune;
    private Negozio negozio;
    //
    private List<Provincia> province;
    private Map<Provincia,List<Comune>> comuniContainer;
    private List<Comune> comuni=new LinkedList<Comune>();
    private List<Negozio> negozi;

    public List<Provincia> getProvince() {
        return province;
    }
    
    public Negozio getNegozio() {
        return negozio;
    }

    public void setNegozio(Negozio negozio) {
        this.negozio = negozio;
    }
    /**
     * Get the value of comuni
     *
     * @return the value of comuni
     */
    public List<Comune> getComuni() {
        return comuni;
    }

    public List<Negozio> getNegozi() {
        return negozi;
    }
    
    /**
     * Refresh della variabile comuni
     */
    public void handleComuni(){
        if(provincia!=null){
            this.comuni=comuniContainer.get(provincia);
        }else{
            this.comuni=new LinkedList<Comune>();
        }
    }
    
    public void handleNegozi(){
        if(comune!=null){
          this.negozi=negozioManager.cercaNegoziDalComune(comune);
        }else{
            this.negozi=new LinkedList<Negozio>();
        }
    }
    
    /**
     * Get the value of comune
     *
     * @return the value of comune
     */
    public Comune getComune() {
        return comune;
    }

    /**
     * Set the value of comune
     *
     * @param comune new value of comune
     */
    public void setComune(Comune comune) {
        Comune comEff=comuneManager.trovaDaId(comune.getId());
        this.comune = comEff;
    }


    /**
     * Get the value of provincia
     *
     * @return the value of provincia
     */
    public Provincia getProvincia() {
        return provincia;
    }

    /**
     * Set the value of provincia
     *
     * @param provincia new value of provincia
     */
    public void setProvincia(Provincia provincia) {
        Provincia provEff=provinciaFacade.find(provincia.getId());
        this.provincia = provEff;
    }

    /**
     * Metodo utilizzato per il testing
     */
    public void verifica(){
        System.out.println(provincia);
        System.out.println(comune);
    }
    
    /**
     * Creates a new instance of ProvinciaComuni
     */
    public ProvinciaComuni() {
    }
    
    @PostConstruct
    public void init(){
        this.province=provinciaFacade.findAll();
        comuniContainer=new TreeMap<Provincia, List<Comune>>();
        for(Provincia p:province){
            comuniContainer.put(p, comuneManager.trovaDaProvincia(p));
        }
    }

    @Override
    public void processValueChange(ValueChangeEvent event) throws AbortProcessingException {
        for(Comune c:comuni){
            if(c.equals(event.getNewValue())){
                setComune(c);
            }
        }
    }
}
